#!/usr/bin/env bash
#==========================================================================
#
#   Copyright NumFOCUS
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#          https://www.apache.org/licenses/LICENSE-2.0.txt
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#
#==========================================================================*/

# This is a list of third party libraries we maintain as Git subtree's
# and the URL with their contribution instructions.
#
# The third party name used should be same as the directory name in
# ITK/Modules/ThirdParty/
third_party_contrib_urls=( "DCMTK:https://github.com/InsightSoftwareConsortium/DCMTK.git"
  "DoubleConversion:https://github.com/google/double-conversion"
  "Eigen3:https://gitlab.kitware.com/phcerdan/eigen.git"
  "Expat:https://github.com/libexpat/libexpat"
  "GDCM:http://gdcm.sourceforge.net/wiki/index.php/Git"
  "GoogleTest:https://github.com/google/googletest/blob/master/CONTRIBUTING.md"
  "HDF5:https://github.com/HDFGroup/hdf5"
  "KWSys:https://gitlab.kitware.com/utils/kwsys/-/blob/master/CONTRIBUTING.rst"
  "libLBFGS:https://github.com/chokkan/liblbfgs"
  "MetaIO:https://github.com/Kitware/MetaIO/blob/master/CONTRIBUTING.rst"
  "MINC:https://github.com/BIC-MNI/libminc"
  "NIFTI:https://github.com/NIFTI-Imaging/nifti_clib"
  "OpenJPEG:https://github.com/uclouvain/openjpeg"
  "PNG:https://github.com/glennrp/libpng"
  "pygccxml:https://github.com/CastXML/pygccxml"
  "TBB:https://github.com/oneapi-src/oneTBB"
  "VNL:https://github.com/vxl/vxl"
  "ZLIB:https://github.com/zlib-ng/zlib-ng" )

upstream_subtree_regex='Modules/ThirdParty/[^/]+/src/[^/]+/'
changed_upstream_dirs=$(git diff --name-only HEAD~1.. |
  egrep -o $upstream_subtree_regex | uniq)
if test -z "$changed_upstream_dirs"; then
  exit
fi

echo "$changed_upstream_dirs" |
while read upstream_dir; do
  lib=$(echo "$upstream_dir" | sed  -e 's%Modules/ThirdParty/\([^/]\+\)/src/[^/]\+/%\1%')

  subject=$(git show -s --format=%f HEAD)
  patchfile=/tmp/${lib}-${subject}.patch
  sha=$(git rev-parse --short HEAD)
  contrib_url=""
  for third_party in "${third_party_contrib_urls[@]}"; do
    name=${third_party%%:*}
    url=${third_party#*:}
    if test "$name" = "$lib"; then
      contrib_url="$url"
      break
    fi
  done

top_level_dir=$(git rev-parse --show-toplevel)

cat << EOF
Changes were detected to the third party library $lib. If the change is
relevant to the upstream library, please submit it upstream.

To create a patch file that can be contributed upstream, run:

  git diff -p --relative="$upstream_dir" $sha~1..$sha -- "$top_level_dir/$upstream_dir" > "$patchfile"

EOF
if test -n "$contrib_url"; then
  cat << EOF

Submit the patch file to the upstream library as instructed at

  $contrib_url

EOF
fi
cat << EOF

The patch can be applied to a local $lib repository with

  cd /path/to/$lib
  patch -p1 < $patchfile


EOF
done
